#!/bin/bash

# 服务器停止脚本
# 用法: ./stop.sh [后缀] [--clean-bin]

set -e

# 配置参数
CONFIG_SUFFIX="$1"
CLEAN_BIN=false
SERVICE_NAME="server"  # 服务名称变量
DEFAULT_PID_DIR="./pid"
DEFAULT_BIN_DIR="./bin"

# 检查是否要清理二进制文件
if [ "$2" = "--clean-bin" ]; then
    CLEAN_BIN=true
fi

if [ -z "$CONFIG_SUFFIX" ]; then
    PID_FILE="$DEFAULT_PID_DIR/${SERVICE_NAME}.pid"
    SERVER_BIN="$DEFAULT_BIN_DIR/$SERVICE_NAME"
    echo "ℹ️ 使用默认配置停止服务器"
else
    PID_FILE="$DEFAULT_PID_DIR/${SERVICE_NAME}_${CONFIG_SUFFIX}.pid"
    SERVER_BIN="$DEFAULT_BIN_DIR/${SERVICE_NAME}_${CONFIG_SUFFIX}"
    echo "ℹ️ 停止后缀为 '${CONFIG_SUFFIX}' 的服务器"
fi

# 检查PID文件是否存在
if [ ! -f "$PID_FILE" ]; then
    echo "❌ 错误: PID文件不存在: $PID_FILE"
    echo "   请检查服务器是否正在运行或使用正确的后缀"
    exit 1
fi

# 读取PID并验证格式
PID=$(cat "$PID_FILE" 2>/dev/null)
if ! echo "$PID" | grep -qE '^[0-9]+$'; then
    echo "❌ 错误: PID文件内容格式错误: $PID_FILE"
    echo "   文件内容: '$PID'"
    rm -f "$PID_FILE"
    exit 1
fi

# 检查进程是否存在
if kill -0 "$PID" 2>/dev/null; then
    echo "🛑 正在停止服务器 (PID: $PID)..."
    kill "$PID"
    
    # 等待进程结束（不使用强制杀死）
    TIMEOUT=30  # 增加超时时间
    while kill -0 "$PID" 2>/dev/null && [ $TIMEOUT -gt 0 ]; do
        sleep 1
        TIMEOUT=$((TIMEOUT - 1))
        echo -n "."
    done
    echo ""
    
    if kill -0 "$PID" 2>/dev/null; then
        echo "❌ 错误: 无法正常停止进程 $PID"
        echo "   进程仍在运行，请手动检查或使用系统工具处理"
        exit 1
    fi
    
    echo "✅ 服务器已正常停止"
else
    echo "⚠️ 进程不存在 (PID: $PID)"
fi

# 清理PID文件
rm -f "$PID_FILE"
echo "🗑️ 已清理PID文件"

# 如果指定了清理二进制文件且不是默认服务器
if [ "$CLEAN_BIN" = true ] && [ -n "$CONFIG_SUFFIX" ] && [ -f "$SERVER_BIN" ]; then
    echo "🗑️ 清理二进制文件: $SERVER_BIN"
    rm -f "$SERVER_BIN"
fi